package com.example.ad.sdk.domain.repositories.base

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.withContext

/**
 * 基础仓库类，提供网络请求的公共方法
 */
open class BaseRepository {

    /**
     * 执行网络请求并处理响应
     *
     * @param call 悬启函数，用于发起网络请求并返回响应
     * @return 返回处理后的响应
     *
     * 此函数将调用悬启函数call以发起网络请求，并在IO线程中处理响应
     * 如果请求失败，将调用onResponseError函数处理错误
     */
    suspend fun <T : Any> execute(call: suspend () -> BaseResponse<T>): BaseResponse<T> {
        return withContext(Dispatchers.IO) {
            try {
                coroutineScope {
                    call.invoke()
                }
            } catch (e: Exception){
                onResponseError()
            }
        }
    }

    /**
     * 执行网络请求并返回一个Flow以支持流处理
     *
     * @param call 悬启函数，用于发起网络请求并返回响应
     * @return 返回一个Flow，用于订阅和处理响应
     *
     * 此函数将调用悬启函数call以发起网络请求，并在IO线程中处理响应
     * 如果请求失败，将调用onResponseError函数处理错误，并通过Flow传播
     */
    suspend fun <T : Any> executeFlow(call: suspend () -> BaseResponse<T>) = flow {
        emit(call.invoke())
    }.flowOn(Dispatchers.IO).catch {
        emit(onResponseError())
    }
}
